/**
 * This file is part of the DbUnit module for NetBeans IDE
 * Copyright (C) 2009 Pavol Pitoňák
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 *
 */

package cz.muni.fi.dbunit;

import java.awt.Component;
import java.util.prefs.Preferences;
import javax.swing.event.ChangeListener;
import org.netbeans.api.project.Project;
import org.openide.WizardDescriptor;
import org.openide.util.HelpCtx;
import org.openide.util.NbPreferences;

/**
 *
 * @author Pavol Pitoňák <pavol@pitonak.com>
 */
public class DbUnitWizardPanel implements WizardDescriptor.Panel {

    /**
     * The visual component that displays this panel. If you need to access the
     * component from this class, just use getComponent().
     */
    private DbUnitVisualPanel component;
    private Project project;

    public DbUnitWizardPanel(Project project) {
        this.project = project;
    }

    // Get the visual component for the panel. In this template, the component
    // is kept separate. This can be more efficient: if the wizard is created
    // but never displayed, or not all panels are displayed, it is better to
    // create only those which really need to be visible.
    public Component getComponent() {
        if (component == null) {
            component = new DbUnitVisualPanel(project);
        }
        return component;
    }

    public HelpCtx getHelp() {
        // Show no Help button for this panel:
        return HelpCtx.DEFAULT_HELP;
    // If you have context help:
    // return new HelpCtx(SampleWizardPanel1.class);
    }

    public boolean isValid() {
        // If it is always OK to press Next or Finish, then:
        return true;
    // If it depends on some condition (form filled out...), then:
    // return someCondition();
    // and when this condition changes (last form field filled in...) then:
    // fireChangeEvent();
    // and uncomment the complicated stuff below.
    }

    public final void addChangeListener(ChangeListener l) {
    }

    public final void removeChangeListener(ChangeListener l) {
    }
    /*
    private final Set<ChangeListener> listeners = new HashSet<ChangeListener>(1); // or can use ChangeSupport in NB 6.0
    public final void addChangeListener(ChangeListener l) {
    synchronized (listeners) {
    listeners.add(l);
    }
    }
    public final void removeChangeListener(ChangeListener l) {
    synchronized (listeners) {
    listeners.remove(l);
    }
    }
    protected final void fireChangeEvent() {
    Iterator<ChangeListener> it;
    synchronized (listeners) {
    it = new HashSet<ChangeListener>(listeners).iterator();
    }
    ChangeEvent ev = new ChangeEvent(this);
    while (it.hasNext()) {
    it.next().stateChanged(ev);
    }
    }
     */

    // You can use a settings object to keep track of state. Normally the
    // settings object will be the WizardDescriptor, so you can use
    // WizardDescriptor.getProperty & putProperty to store information entered
    // by the user.
    public void readSettings(Object settings) {
        Preferences pref = NbPreferences.forModule(SimpleTestWizardPanel.class);

        component.setSetUpOperation(pref.get("dbuw_setUpOperation", null));
        component.setTearDownOperation(pref.get("dbuw_tearDownOperation", null));
        component.setGetDatabaseTester(pref.getBoolean("dbuw_getDatabaseTester", false));
        component.setNewDatabaseTester(pref.getBoolean("dbuw_newDatabaseTester", false));
        component.setCloseConnection(pref.getBoolean("dbuw_closeConnection", false));
        component.setConnectionIndex(pref.getInt("dbuw_connectionIndex", 0));
    }

    public void storeSettings(Object settings) {
        ((WizardDescriptor) settings).putProperty(
                DbUnitVisualPanel.DATABASE_URL, component.getDatabaseUrl());
        ((WizardDescriptor) settings).putProperty(
                DbUnitVisualPanel.DATABASE_USERNAME, component.getDatabaseUsername());
        ((WizardDescriptor) settings).putProperty(
                DbUnitVisualPanel.DATABASE_PASSWD, component.getDatabasePassword());
        ((WizardDescriptor) settings).putProperty(
                DbUnitVisualPanel.DATABASE_SCHEMA, component.getDatabaseSchema());

        ((WizardDescriptor) settings).putProperty(
                DbUnitVisualPanel.DATASET_PATH, component.getDataSetPath());

        ((WizardDescriptor) settings).putProperty(
                DbUnitVisualPanel.SET_UP_OPERATION, component.getSetUpOperation());
        
        ((WizardDescriptor) settings).putProperty(
                DbUnitVisualPanel.TEAR_DOWN_OPERATION, component.getTearDownOperation());

        ((WizardDescriptor) settings).putProperty(
                DbUnitVisualPanel.NEW_DATABASE_TESTER, component.isNewDatabaseTester());
        ((WizardDescriptor) settings).putProperty(
                DbUnitVisualPanel.GET_DATABASE_TESTER, component.isGetDatabaseTester());
        ((WizardDescriptor) settings).putProperty(
                DbUnitVisualPanel.CLOSE_CONNECTION, component.isCloseConnection());

        Preferences pref = NbPreferences.forModule(SimpleTestWizardPanel.class);
        
        if (component.getSetUpOperation() != null) {
            pref.put("dbuw_setUpOperation", component.getSetUpOperation());
        }
        if (component.getTearDownOperation() != null) {
            pref.put("dbuw_tearDownOperation", component.getTearDownOperation());
        }
        pref.putBoolean("dbuw_getDatabaseTester", component.isGetDatabaseTester());
        pref.putBoolean("dbuw_newDatabaseTester", component.isNewDatabaseTester());
        pref.putBoolean("dbuw_closeConnection", component.isCloseConnection());
        pref.putInt("dbuw_connectionIndex", component.getConnectionIndex());
    }
}

